package com.henu.engineer.dao.mapper.student

import com.henu.engineer.dao.entity.user.Student
import com.henu.engineer.dao.mapper.UserXmlMapper
import org.apache.ibatis.annotations.Mapper
import org.springframework.dao.DuplicateKeyException
import org.springframework.stereotype.Repository

/**
 * 学生表
 * @author noexcept
 * @date 2021/7/22 17:51
 */
@Mapper
@Repository
interface StudentXmlMapper : UserXmlMapper {
    /**
     * 通过学号查询某个学生的信息
     *
     * @return
     */
    fun selectStudent(id: String): Student?

    /**
     * 根据多个学号查找多个学生，如果需要分页，请这样写：
     * <blockquote>
     * <pre>
     * PageHelper.startPage(pageNum, pageSize);
     * studentXmlMapper.selectStudentsById(studentIds);</pre>
     *
     * </blockquote>
     *
     * @param studentIds 包含所查所查学生的学号
     * @return
     */
    fun selectStudentsById(studentIds: List<String>): List<Student>

    /**
     * 查找某个专业的所有同学：如果需要分页：
     * <blockquote>
     * <pre>
     * `PageHelper.startPage(pageNum, pageSize);
     * studentXmlMapper.selectStudentsBySpecialization(specialization);
    ` *
    </pre> *
    </blockquote> *
     * @param specialization
     * @return
     */
    fun selectStudentsBySpecialization(specialization: String): List<Student>

    /**
     * 查找某个年级的所有同学，如果需要分页：
     * <blockquote>
     * <pre>
     * `PageHelper.startPage(pageNum, pageSize);
     * studentXmlMapper.selectStudentsByGrade(grade);
    ` *
    </pre> *
    </blockquote> *
     * @param grade 格式：YYYY，例如："2022"
     * @return
     */
    fun selectStudentsByGrade(grade: String): List<Student>

    /**
     * 查找某专业某年级所有同学,如果需要分页：
     * <blockquote>
     * <pre>
     * `PageHelper.startPage(pageNum, pageSize);
     * studentXmlMapper.selectStudentsBySpecAndGrade(specialization,grade);
    ` *
    </pre> *
    </blockquote> *
     * @param specialization
     * @param grade 格式：YYYY，例如："2022"
     * @return
     */
    fun selectStudentsBySpecAndGrade(specialization: String, grade: String): List<Student>

    /**
     * 插入一个学生记录
     *
     * @param student
     * @return
     * @throws DuplicateKeyException : 可能会因为学号相同出现异常
     */
    @Throws(DuplicateKeyException::class)
    fun insertStudent(student: Student): Boolean

    /**
     * 插入多位学生
     * @param students
     * @return
     */
    fun insertStudents(students: List<Student>): Int

    /**
     * 修改联系方式
     *
     * @param id      学号
     * @param contact 新的联系方式
     * @return 是否成功
     */
    fun updateContact(id: String, contact: String): Boolean

    /**
     * 修改专业（可能转专业）
     *
     * @param id
     * @param specialization 新的专业名称
     * @return
     */
    fun updateSpecialization(id: String, specialization: String): Boolean

    /**
     * 修改特定项的信息
     * item只能是：name,gender,specialization,contact,identity之一，并符合相应的数据约束
     */
    fun updateItemValue(id: String, item: String, newValue: String): Boolean
}